
; void monocromatizar_inf_asm(unsigned char *src,  	rdi 8
			;unsigned char *dst,  		rsi 12
			;int h,               		rdx 16
			;int w,               		rcx 20
			;int src_row_size,    		r8  24
			;int dst_row_size)    		r9  28


global monocromatizar_inf_asm

section .text


monocromatizar_inf_asm:

	push rbp	
	mov rbp, rsp
	push rbx
	push r12
	push r13
	push r14
	push r15		;armo el stack

	pxor xmm7, xmm7
	mov eax, 0x0000ff00
	movd xmm6, eax
	pslldq xmm6, 8
	por xmm7, xmm6
	mov eax, 0x00ff0000
	movd xmm6, eax
	pslldq xmm6, 4
	por xmm7, xmm6
	mov eax, 0xff0000ff
	movd xmm6, eax
	por xmm7, xmm6;
	
	xor rax, rax

	mov rax, r8
	sub rax, rcx			;[ebp + 20]
	sub rax, rcx			;[ebp + 20]
	sub rax, rcx			;[ebp + 20]
	xor r10, r10
	mov r10, rax ; en (ebp - 4) r10 tengo el desplazamiendo de src

	;xor rax, rax

	mov rax, r9			;[ebp + 28]
	sub rax, rcx			;[ebp + 20]
	xor r11, r11
	mov r11, rax ; en (ebp - 8) r11 tengo el desplazamiento de dst

;	xor rax, rax

	mov rax, rcx			; [ebp + 20]
	shr rax, 2
	xor r12, r12
	mov r12, rax	; en (ebp - 12) r12 tengo la cantidad de iteraciones por fila

	xor rbx, rbx

	shl rax, 2
	mov rbx, rcx			;[ebp + 20]
	sub rbx, rax
	mov r13, rbx	; en (ebp - 16) r13 tengo la cantidad de pixels q no entraron en la iteracion por no ser multiplo de 4

	xor rcx, rcx
	mov rcx, rdx		;en rcx tengo la altura
		



cicloF:
	cmp rcx, 0

	jle salir2

	xor r15, r15
	mov r15, r12		; mov ecx, [ebp - 12]	en r15 tengo la cantidad de it x fila

	cicloC:
		cmp r15, 0
		je salir

		movdqu xmm0, [rdi]	;xmm0= R1|G1|B1|R2|G2|B2|R3|G3|B3|R4|G4|B4|R5|G5|B5|R6 , cada color ocupa un byte
		movdqu xmm1, xmm0	;xmm1 = R1|G1|B1|R2|G2|B2|R3|G3|B3|R4|G4|B4|R5|G5|B5|R6 , cada color ocupa un byte
		movdqu xmm2, xmm0	;xmm2 = R1|G1|B1|R2|G2|B2|R3|G3|B3|R4|G4|B4|R5|G5|B5|R6 , cada color ocupa un byte
		psrldq xmm1, 1		;xmm1 = G1|B1|R2|G2|B2|R3|G3|B3|R4|G4|B4|R5|G5|B5|R6|0 , cada color ocupa un byte
		psrldq xmm2, 2		;xmm2 = B1|R2|G2|B2|R3|G3|B3|R4|G4|B4|R5|G5|B5|R6|0|0 , cada color ocupa un byte
		pmaxub xmm0, xmm1
		pmaxub xmm0, xmm2	;dejo los maximos en xmm0
		pand xmm0, xmm7		
		movdqu xmm1, xmm0	
		movdqu xmm2, xmm0
		movdqu xmm3, xmm0
		psrldq xmm1, 2
		psrldq xmm2, 4 
		psrldq xmm3, 9
		pslldq xmm3, 3
		pslldq xmm0, 13
		psrldq xmm0, 13
		por xmm0, xmm1
		por xmm0, xmm2
		por xmm0, xmm3
		movd [rsi], xmm0		;xmm0
		add rsi, 4	;4
		add rdi, 12	;12
		dec r15
		jmp cicloC

salir: 
	
	jmp convertirRestantes

cont:   


	add rdi, r10
	add rsi, r11	
	dec rcx	

	jmp cicloF

salir2:

	pop r15			;desapilo el stack
	pop r14
	pop r13
	pop r12
	pop rbx
	pop rbp
	ret


convertirRestantes:
	xor r14, r14
	mov r14, r13


seguirMirando:	

	cmp r14, 0
	je cont

	xor rax, rax
	xor rbx, rbx

	mov al, [rdi]
	mov bl, [rdi + 1]
	cmp eax, ebx		;max(src[1],src[2])
	jg esMasGrandeElPrimero
	
	xor eax, eax
	mov al, bl
	xor ebx, ebx

esMasGrandeElPrimero:
	mov bl, [rdi+2]
	cmp eax, ebx		;max(src[0],max(src[1],src[2]))
	jg eaxEsMasGrande
	mov al, bl

eaxEsMasGrande:
	mov [rsi], al		;eax	
	
	inc rsi
	add rdi, 3
	dec r14


	jmp seguirMirando


